package com.baomidou.mybatisplus.samples.tenant.context;


import com.sun.tools.javac.util.Convert;
import sun.security.util.SecurityConstants;

import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;

/**
 * 获取当前线程变量中的 企业Id | 企业账号 | 租户类型 | 用户id | 用户账号 | 用户类型 | Token等信息
 * 注意： 必须在网关通过请求头的方法传入，同时在HeaderInterceptor拦截器设置值。 否则这里无法获取
 *
 * @Auther: 乔帅 ymxz34787409@126.com
 * @Date: 2022/2/21 20:40
 */
public class SecurityContextHandler {
    // 保存是否忽略租户条件的key值
    private static String IGNORE_TENANT_KEY = "ignore_tannent";

    private static final ThreadLocal<Map<String, Object>> THREAD_LOCAL = ThreadLocal.withInitial(() -> {
        final Map<String, Object> map = new HashMap<>(16);
        // 设置忽略租户条件默认值,为false
        map.put(IGNORE_TENANT_KEY, false);
        return map;
    });


    public static void set(String key, Object value) {
        final Map<String, Object> map = getLocalMap();
        map.put(key, value == null ? "" : value);
    }

    public static String get(String key) {
        final Map<String, Object> map = getLocalMap();
        return (String) map.getOrDefault(key, "");
    }


    public static <T> T get(String key, Class<T> clazz) {
        return (T) getLocalMap().get(key);
    }

    public static Map<String, Object> getLocalMap() {
        Map<String, Object> map = THREAD_LOCAL.get();
        if (map == null) {
            map = new ConcurrentHashMap<String, Object>();
            THREAD_LOCAL.set(map);
        }
        return map;
    }


    public void setLocalMap(Map<String, Object> map) {
        THREAD_LOCAL.set(map);
    }

    /**
     * 清空本地缓存
     */
    public static void remove() {
        THREAD_LOCAL.remove();
    }


    /**
     * 设置当前方法是否忽略租户条件（本地缓存）
     */
    public static void setIgnore(boolean b) {
        SecurityContextHandler.set(IGNORE_TENANT_KEY, b);
    }


    /**
     * 获取当前方法是否忽略租户条件（本地缓存）
     */
    public static Boolean getIgnore() {
        return SecurityContextHandler.get(IGNORE_TENANT_KEY, Boolean.class);
    }


}
